iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

什麼是 Socket ?

Socket 充當了應用層與 TCP/IP 協議之間的橋梁。通過提供一組抽象的接口,Socket 將複雜的底層通訊協議封裝起來,使得開發者可以更方便地進行網路程式設計。它隱藏了複雜的實作細節,只暴露出簡單易用的接口,簡化了網路程式設計的複雜性。

在開發中,Socket 提供的接口使開發者不需要關心底層協議的具體細節,比如連接建立、資料傳輸的順序保證、資料的分組和重組等,開發者只需調用相應的接口,Socket 會根據應用層的需求自動處理這些細節。這樣,程式設計師可以專注於應用邏輯,而不用深入理解底層網路協議的實現。

其中以 TCP 與 UDP 兩種主要通訊方式最常被使用,本章只介紹 TCP ,因一般瀏覽網頁的 HTTP 協議就是基於 TCP 的基礎

TCP 和 UDP 是什麼?

TCP(通訊控制協定)和 UDP(用戶資料包協定)是網際網路中兩種常見的協定,它們負責在網路中進行資料傳輸。

這兩種協定都會將要傳輸的資料分隔成更小的單元,稱為封包。封包中包含了發送端和接收端的 IP 位址、各種配置資訊、以及使用者傳送的實際資料。這樣的封包化處理方式使得資料在網路中能夠更加有效且可靠地進行傳輸。

TCP 和 UDP 雖然都使用封包進行傳輸,但它們的工作方式有所不同。TCP 強調資料傳輸的可靠性,TCP 會為每個封包分配一個唯一的識別碼和一個序號,確保所有封包按照正確的順序到達並且沒有遺漏。相比之下,UDP 不需要唯一識別碼和序號就能完成相同的工作,UDP 則追求較高的傳輸效率,允許封包在傳輸過程中丟失,適合對速度要求高但對完整性要求不高的應用場景(例如 : 串流影音)。

TCP 與 UDP 比較

https://ithelp.ithome.com.tw/upload/images/20240814/20168345eVrHiYz0hY.png
圖源

基於 TCP 的 Socket

https://ithelp.ithome.com.tw/upload/images/20240814/20168345R8Ad8Y4TEQ.png
圖源

Server 端

import socket

host = "127.0.0.1"    # 標準本地接口地址(localhost)
port = 60001          # 要監聽的端口(非特權端口 > 1023)

# 創建Socket對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 綁定地址和端口
server_socket.bind((host, port))

# 開始監聽
server_socket.listen(5)
print(f"伺服器正在{port}端口上監聽...")

while True:
    client_socket, addr = server_socket.accept()
    print(f"已連接到:{addr}")

    # 接收資料
    data = client_socket.recv(1024).decode('utf-8')
    print(f"接收到資料:{data}")

    # 回應訊息
    client_socket.send("已接收到你的訊息".encode('utf-8'))

    # 關閉連接
    client_socket.close()

Client 端

import socket

host = "127.0.0.1"  # 伺服器的主機名或 IP 地址
port = 60001        # 伺服器使用的端口

# 創建Socket對象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 連接到伺服器
client_socket.connect((host, port))

# 發送資料給伺服器
message = "你好,伺服器!"
client_socket.send(message.encode('utf-8'))

# 從伺服器接收資料(最多 1024 Byte)
response = client_socket.recv(1024).decode('utf-8')
print(f"從伺服器接收:{response}") 

# 關閉連接
client_socket.close()

資料來源 :
https://blog.csdn.net/weixin_39258979/article/details/80835555
https://nordvpn.com/zh-tw/blog/tcp-udp-bijiao/
https://commons.wikimedia.org/wiki/File:InternetSocketBasicDiagram_zhtw.png
https://realpython.com/python-sockets/


上一篇
[Python] 批量更改檔案名稱和轉檔
下一篇
[Python] Socket + Threading
系列文
一些Python可以做的事19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言